www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MPTran.cpp

    // MPTran.cpp: implementation of the CMPTran class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MPTran.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMPTran::CMPTran()
{
}

CMPTran::~CMPTran()
{
}
int  CMPTran::GetTranItem(int Item_data,BYTE Flags)
{
	int data    = Item_data & 0xFFFF;//bit15 bit14 == 1 表示设置,==0 表示查询
	char LoBYTE = Item_data & 0xFF;
	char HiBYTE = ( Item_data & 0xFF00 ) >> 8;
	char LoBCD  = LoBYTE & 0x0F;
	char HiBCD  = (LoBYTE & 0xF0) >> 4;
#ifdef DBUG_PRO
	printf("\r\nITEM%x",HiBYTE);
#endif
	data = 0;
	switch(HiBYTE & 0xFF)
	{
	case 0x90:
	     data = 0x0100 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;
	case 0x91:
	     data = 0x0120 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;	
	case 0xA0:
	case 0xB0:
	     data = 0x0140 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;
	case 0x94:
	     data = 0x0200 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;
	case 0x95:
	     data = 0x0200 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;
	case 0xA4:
	case 0xB4:
	     data = 0x0240 + (LoBYTE & 0xF0) + ((LoBCD + 1) & 0x0F);
	     break;
	case 0xB3:
	     if(HiBCD == 2)
	     {
	     	data = 0x0310 + ((LoBCD + 1) & 0x0F);
	     }	     
	     break;
        case 0xB6:
             data = 0x0400;
             break;
        case 0xC3:
             if(HiBCD ==3)
             {
             	data = 0x0710;
             }        
             break;
		
	}
#ifdef DBUG_PRO
	printf("\r\nDATA%x",data);
#endif
	return data;
}
int  CMPTran::FormCheckClock(BYTE *buff,time_t *m_time , BYTE * addr)//设置电表时钟
{
	return 0;
}

int  CMPTran::FormReadDataFrame(BYTE *buff, int item , BYTE * addr)
{
	return CMPZJ::FormReadDataFrame(buff, GetTranItem(item,0) , addr);
}

int  CMPTran::FormSetAddress(BYTE *buff, BYTE *addr)//设置电表地址
{
	return 0;
}

int  CMPTran::ProcReturnedFrame(BYTE *inbuff, int inLen,int &item, BYTE *outbuff,int &outlen,BYTE *addr)//返回数据的处理
{
	int m = CMPZJ::ProcReturnedFrame(inbuff, inLen,GetTranItem(item,0), outbuff,outlen,addr);
	if( m != 0)
	      return m;
	if(outlen == 0)
	      return 0;
	BYTE buf[256];
	long i,j;
	switch( item )
	{
		case 0xA01F:
		case 0xA02F:
		     outlen = 15;
		     for(i = 0;i < 5;i++)
		     {
		     	memcpy(&buf[3 *i],&outbuff[7 * i],3);
		     	
		     }
		     memcpy(outbuff,buf,15);
		     break;
	        case 0xB01F:
	        case 0xB02F:
		     outlen = 20;
		     for(i = 0;i < 5;i++)
		     {
		     	memcpy(&buf[4 *i],&outbuff[7 * i + 3],4);
		     	
		     }
		     memcpy(outbuff,buf,20);
		     break;
	        case 0xB61F:
	             if(addr[1] == 0x03)//三相三线
	             {
	             	buf[0] = outbuff[12];buf[1] = outbuff[13];//A相电压
	             	buf[2] = 0;buf[3] = 0;
	             	buf[4] = outbuff[14];buf[5] = outbuff[15];//C相电压
	             }
	             else
	             {
	             	memcpy(buf,&outbuff[12],6);
	             }	        
	             memcpy(outbuff,buf,6);
	             outlen = 6;
	             break;
	        case 0xB62F:
	             if(addr[1] == 0x03)//三相三线
	             {
	             	buf[0] = outbuff[18];buf[1] = outbuff[19];//A相电流
	             	buf[2] = 0;buf[3] = 0;
	             	buf[4] = outbuff[20];buf[5] = outbuff[21];//C相电流
	             }
	             else
	             {
	             	memcpy(buf,&outbuff[18],6);
	             }	        
	             memcpy(outbuff,buf,6);
	             outlen = 6;	             break;	             
	        case 0xB63F://有功功率
	             i = TranBcdToHex(outbuff[0]) + TranBcdToHex(outbuff[1]) * 100 + TranBcdToHex(outbuff[2]) *10000;
	             j = TranBcdToHex(outbuff[3]) + TranBcdToHex(outbuff[4]) * 100 + TranBcdToHex(outbuff[5]) *10000;
	             i -= j;
	             outbuff[0] = TranHexToBcd(i & 0xFF);	             
	             outbuff[1] = TranHexToBcd((i >> 8 ) & 0xFF);
	             outbuff[2] = TranHexToBcd((i >> 16) & 0xFF);
	             memset(&outbuff[3],0xFF,9);
	             outlen = 12;
	             break;	             
	        case 0xB64F://无功功率
	             i = TranBcdToHex(outbuff[6]) + TranBcdToHex(outbuff[ 7]) * 100 + TranBcdToHex(outbuff[ 8]) *10000;
	             j = TranBcdToHex(outbuff[9]) + TranBcdToHex(outbuff[10]) * 100 + TranBcdToHex(outbuff[11]) *10000;
	             i -= j;
	             outbuff[0] = TranHexToBcd(i & 0xFF);	             
	             outbuff[1] = TranHexToBcd((i >> 8 ) & 0xFF);
	             memset(&outbuff[2],0xFF,6);
	             outlen = 8;
	             break;
	        case 0xB65F:
	             outlen = 0;             
	             break;
	}
	
	return 0;
}



/*	TRANITEM  [100] = {
		{0x9010,0x111},{0x9011,0x112},{0x9012,0x113},{0x9013,0x114},{0x9014,0x115},{0x901F,0x110},//当前正向有功电量
		{0x9020,0x121},{0x9021,0x122},{0x9022,0x123},{0x9023,0x124},{0x9024,0x125},{0x902F,0x120},
		
		{0x9110,0x131},{0x9111,0x132},{0x9112,0x133},{0x9113,0x134},{0x9114,0x135},{0x911F,0x130},
		{0x9120,0x141},{0x9121,0x142},{0x9122,0x143},{0x9123,0x144},{0x9124,0x145},{0x912F,0x140},
		
		{0xA010,0x151},{0xA011,0x152},{0xA012,0x153},{0xA013,0x154},{0xA014,0x155},{0xA01F,0x150},//当前需量最大值
		{0xA020,0x161},{0xA021,0x162},{0xA022,0x163},{0xA023,0x164},{0xA024,0x165},{0xA02F,0x160},//“”“”“”“”“”
		{0xB010,0x151},{0xB011,0x152},{0xB012,0x153},{0xB013,0x154},{0xB014,0x155},{0xB01F,0x150},//需量时间
		{0xB020,0x161},{0xB021,0x162},{0xB022,0x163},{0xB023,0x164},{0xB024,0x165},{0xB02F,0x160},//""""""""""
		
		{0x9410,0x211},{0x9411,0x212},{0x9412,0x213},{0x9413,0x214},{0x9414,0x215},{0x941F,0x210},
		{0x9420,0x221},{0x9421,0x222},{0x9422,0x223},{0x9423,0x224},{0x9424,0x225},{0x942F,0x220},
		{0x9510,0x231},{0x9511,0x232},{0x9512,0x233},{0x9513,0x234},{0x9514,0x235},{0x951F,0x230},
		{0x9520,0x241},{0x9521,0x242},{0x9522,0x243},{0x9523,0x244},{0x9524,0x245},{0x952F,0x240},
		
		{0xA410,0x251},{0xA411,0x252},{0xA412,0x253},{0xA413,0x254},{0xA414,0x255},{0xA41F,0x250},//上月需量最大值		
		{0xA420,0x261},{0xA421,0x262},{0xA422,0x263},{0xA423,0x264},{0xA424,0x265},{0xA42F,0x260},
		
		{0xB410,0x251},{0xB425,0x252},{0xB412,0x253},{0xB413,0x254},{0xB414,0x255},{0xB41F,0x250},//上月需量时间
		{0xB420,0x261},{0xB421,0x262},{0xB422,0x263},{0xB423,0x264},{0xB424,0x265},{0xB42F,0x260},
		
		{0xB320,0x311},{0xB321,0x312},{0xB322,0x313},{0xB323,0x314},               {0xB32F,0x310},//失压
		
		{0xB611,0x400},{0xB612,0x400},{0xB613,0x400},{0xB61F,0x400},//瞬时量电压
		{0xB621,0x400},{0xB622,0x400},{0xB623,0x400},{0xB62F,0x400},//电流
		{0xB630,0x400},                              {0xB63F,0x400},
		{0xB640,0x400},                              {0xB64F,0x400}
	};
*/